package com.priox.sigar.infraestructura.persistence.jpa.sigar;

import com.mm.support.jpa.BaseDAO;
import com.priox.sigar.client.dto.OperacionCuentaDTO;
import com.priox.sigar.client.dto.RangoDetalleDTO;
import com.priox.sigar.dto.ReporteContext;
import com.priox.sigar.domain.model.ReporteRepository;
import com.priox.sigar.dto.RepAnnosCxPDTO;
import com.priox.sigar.util.ListUtil;
import com.priox.sigar.util.StringUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Repository;

import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.util.*;


/**
 * User: aglwkrs
 * Date: 30/11/11
 */
@Repository
public class ReporteRepositoryImpl extends BaseDAO implements ReporteRepository {

    private final static Logger logger = LoggerFactory.getLogger(ReporteRepositoryImpl.class);


    private NamedParameterJdbcTemplate jdbcTemplate;


    @Autowired
    DataSource dataSource;


    @PostConstruct
    public void init() {
        this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
    }

    String templateRango2 = " WHEN ABS(TT.TOTAL) #expresion1# #min# and ABS(TT.TOTAL) #expresion2# #max# THEN '#orden#' ";
    String templateRango1 = " WHEN ABS(TT.TOTAL) #expresion1# #min# THEN '#orden#' ";

    public List<OperacionCuentaDTO> findRepDetalleGlobalesCxA(Map parametros) {

        List<RangoDetalleDTO> rangoDetalleList = new ArrayList<RangoDetalleDTO>();
        if (parametros.get("rangoId") != null) {
            rangoDetalleList = findRangoDetalle((Long)parametros.get("rangoId"));
        }
        if(rangoDetalleList.isEmpty()) return new ArrayList<OperacionCuentaDTO>();

        StringBuffer sql = new StringBuffer();

        sql.append(" SELECT ");
        sql.append(" T.CHECKPOINT_ID AS checkPointId, ");
        sql.append(" SGE.NOMBRE      AS grupoEmpresarialNombre, ");
        sql.append(" T.SOCIEDAD_ID   AS sociedadId, ");
        sql.append(" T.RANGO rango , ");
        sql.append(" CASE ");
        for (RangoDetalleDTO rangoDetalleDTO : rangoDetalleList) {
            sql.append("WHEN T.RANGO ='" + rangoDetalleDTO.getOrden() + "' THEN '" + rangoDetalleDTO.getDescripcion() + "' ");
        }
        sql.append(" END AS rangoLabel, ");
        sql.append(" T.NUMERO_DOCUMENTO_COMPRA numeroDocumentoCompra, ");
        sql.append(" T.ACREEDOR_DOCUMENTO as acreedorDocumento, ");
        sql.append(" T.ACREEDOR_RAZON_SOCIAL as acreedorRazonSocial, ");
        sql.append(" T.FECHA_CONTABLE as fechaContable, ");
        sql.append(" T.FECHA_RECIENTE as fechaReciente, ");
        sql.append(" T.USUARIO as usuario, ");
        sql.append(" T.TOTAL montoTotal ");
        sql.append(" FROM ");
        sql.append(" ( ");
        int i=0;
        if (parametros.get("anno")==null || NumberUtils.isNumber((String) parametros.get("anno"))) {
            sql.append(" SELECT ");
            sql.append(" YEAR(TT.FECHA_RECIENTE)ANNO, ");
            sql.append(" TT.CHECKPOINT_ID, ");
            sql.append(" TT.SOCIEDAD_ID, ");
            sql.append(" TT.NUMERO_DOCUMENTO_COMPRA, ");
            sql.append(" TT.ACREEDOR_DOCUMENTO, ");
            sql.append(" TT.ACREEDOR_RAZON_SOCIAL, ");
            sql.append(" TT.USUARIO, ");
            sql.append(" TT.FECHA_CONTABLE, ");
            sql.append(" TT.FECHA_RECIENTE, ");
            sql.append(" TT.TOTAL, ");
            sql.append(" CASE ");
            i = 1;
//           [Total > 10] - [Total > 20]
            for (RangoDetalleDTO rango : rangoDetalleList) {
                String[] item = StringUtils.split(rango.getExpresion(), " ");
                if (item.length > 5) {
                    Map<String, String> parametrosx = new HashMap<String, String>();
                    parametrosx.put("#expresion1#", item[2]);
                    parametrosx.put("#min#", item[3]);
                    parametrosx.put("#expresion2#", item[8]);
                    parametrosx.put("#max#", item[9]);
                    parametrosx.put("#orden#", rango.getOrden());
                    sql.append(StringUtil.replaceFull(templateRango2, parametrosx));
                } else  {
                    Map<String, String> parametrosx = new HashMap<String, String>();
                    parametrosx.put("#expresion1#", item[2]);
                    parametrosx.put("#min#", item[3]);
                    parametrosx.put("#orden#", rango.getOrden());
                    sql.append(StringUtil.replaceFull(templateRango1, parametrosx));
                }
            }
            sql.append(" ELSE NULL ");
            sql.append(" END as RANGO ");
            sql.append(" FROM ");
            sql.append(" (SELECT ");
            sql.append(" DETALLE.CHECKPOINT_ID, ");
            sql.append(" DETALLE.SOCIEDAD_ID, ");
            sql.append(" DETALLE.NUMERO_DOCUMENTO_COMPRA, ");
            sql.append(" DETALLE.ACREEDOR_DOCUMENTO, ");
            sql.append(" DETALLE.ACREEDOR_RAZON_SOCIAL, ");
            sql.append(" DETALLE.USUARIO, ");
            sql.append(" DETALLE.FECHA_CONTABLE, ");
            sql.append(" DETALLE.FECHA_RECIENTE, ");
            sql.append(" SUM(" + parametros.get("columnaMonto") + ") TOTAL ");
            sql.append(" FROM ");
            sql.append(" SGTM_OPERACION_CUENTA DETALLE ");
            sql.append(" WHERE ");
            sql.append(" DETALLE.CHECKPOINT_ID = " + parametros.get("checkPointId") + " ");
            if(parametros.get("anno")!=null){
                if (parametros.get("anno_base").equals(parametros.get("anno"))) {
                    sql.append(" AND YEAR (DETALLE.FECHA_RECIENTE) <= " + parametros.get("anno") + " ");
                } else {
                    sql.append(" AND YEAR (DETALLE.FECHA_RECIENTE) = " + parametros.get("anno") + " ");
                }
            }
            sql.append(" AND DETALLE.NUMERO_DOCUMENTO_COMPRA IS NOT NULL ");
            sql.append(" AND DETALLE.FECHA_RECIENTE IS NOT NULL ");
            sql.append(" GROUP BY ");
            sql.append(" DETALLE.CHECKPOINT_ID, ");
            sql.append(" DETALLE.SOCIEDAD_ID, ");
            sql.append(" DETALLE.NUMERO_DOCUMENTO_COMPRA, ");
            sql.append(" DETALLE.ACREEDOR_DOCUMENTO, ");
            sql.append(" DETALLE.ACREEDOR_RAZON_SOCIAL, ");
            sql.append(" DETALLE.USUARIO, ");
            sql.append(" DETALLE.FECHA_CONTABLE, ");
            sql.append(" DETALLE.FECHA_RECIENTE ");
            sql.append(" ) ");
            sql.append(" AS TT ");
        }
        if (StringUtils.contains((String) parametros.get("anno"), "-")) {
            sql.append(" SELECT ");
            sql.append(" MONTH(TT.FECHA_RECIENTE) ANNO, ");
            sql.append(" TT.CHECKPOINT_ID, ");
            sql.append(" TT.SOCIEDAD_ID, ");
            sql.append(" TT.NUMERO_DOCUMENTO_COMPRA, ");
            sql.append(" TT.ACREEDOR_DOCUMENTO, ");
            sql.append(" TT.ACREEDOR_RAZON_SOCIAL, ");
            sql.append(" TT.USUARIO, ");
            sql.append(" TT.FECHA_CONTABLE, ");
            sql.append(" TT.FECHA_RECIENTE, ");
            sql.append(" TT.TOTAL, ");
            sql.append(" CASE ");
//            i = 1;
            for (RangoDetalleDTO rango : rangoDetalleList) {
                String[] item = StringUtils.split(rango.getExpresion(), " ");
                if (item.length > 5) {
                    Map<String, String> parametrosx = new HashMap<String, String>();
                    parametrosx.put("#expresion1#", item[2]);
                    parametrosx.put("#min#", item[3]);
                    parametrosx.put("#expresion2#", item[8]);
                    parametrosx.put("#max#", item[9]);
                    parametrosx.put("#orden#", rango.getOrden());
                    sql.append(StringUtil.replaceFull(templateRango2, parametrosx));
                } else  {
                    Map<String, String> parametrosx = new HashMap<String, String>();
                    parametrosx.put("#expresion1#", item[2]);
                    parametrosx.put("#min#", item[3]);
                    parametrosx.put("#orden#", rango.getOrden());
                    sql.append(StringUtil.replaceFull(templateRango1, parametrosx));
                }
            }
            sql.append(" ELSE NULL ");
            sql.append(" END as RANGO ");
            sql.append("  FROM ");
            sql.append(" (SELECT ");
            sql.append(" DETALLE.CHECKPOINT_ID, ");
            sql.append(" DETALLE.SOCIEDAD_ID, ");
            sql.append(" DETALLE.NUMERO_DOCUMENTO_COMPRA, ");
            sql.append(" DETALLE.ACREEDOR_DOCUMENTO, ");
            sql.append(" DETALLE.ACREEDOR_RAZON_SOCIAL, ");
            sql.append(" DETALLE.USUARIO, ");
            sql.append(" DETALLE.FECHA_CONTABLE, ");
            sql.append(" DETALLE.FECHA_RECIENTE, ");
            sql.append(" SUM(" + parametros.get("columnaMonto") + ") TOTAL ");
            sql.append(" FROM ");
            sql.append(" SGTM_OPERACION_CUENTA DETALLE ");
            sql.append(" WHERE ");
            sql.append(" DETALLE.CHECKPOINT_ID = " + parametros.get("checkPointId") + "  ");
            if (parametros.get("anno_base").equals(parametros.get("anno"))) {
                sql.append(" AND YEAR (DETALLE.FECHA_RECIENTE) <= " + parametros.get("anno") + " ");
            } else {
                if (NumberUtils.isNumber((String) parametros.get("anno"))) {
                    sql.append(" AND YEAR (DETALLE.FECHA_RECIENTE) = " + parametros.get("anno") + " ");
                } else {
                    int partes = (Integer) parametros.get("columns");
                    int parte = Integer.parseInt(StringUtils.split((String) parametros.get("anno"), "-")[1]);
                    sql.append(" AND YEAR (DETALLE.FECHA_RECIENTE) = " + StringUtils.split((String) parametros.get("anno"), "-")[0] + " ");
                    sql.append(" AND ( MONTH (DETALLE.FECHA_RECIENTE) >= " + (12 / partes * (parte - 1)) + " ");
                    sql.append(" AND MONTH (DETALLE.FECHA_RECIENTE) <= " + (12 / partes * parte) + " ) ");
                }
            }
            sql.append(" AND DETALLE.NUMERO_DOCUMENTO_COMPRA IS NOT NULL ");
            sql.append(" AND DETALLE.FECHA_RECIENTE IS NOT NULL ");
            sql.append(" GROUP BY ");
            sql.append(" DETALLE.CHECKPOINT_ID, ");
            sql.append(" DETALLE.SOCIEDAD_ID, ");
            sql.append(" DETALLE.NUMERO_DOCUMENTO_COMPRA, ");
            sql.append(" DETALLE.ACREEDOR_DOCUMENTO, ");
            sql.append(" DETALLE.ACREEDOR_RAZON_SOCIAL, ");
            sql.append(" DETALLE.USUARIO, ");
            sql.append(" DETALLE.FECHA_CONTABLE, ");
            sql.append(" DETALLE.FECHA_RECIENTE  ");
            sql.append(" ) ");
            sql.append(" AS TT ");

        }
        sql.append(" ) ");
        sql.append(" AS T ");
        sql.append(" INNER JOIN dbo.SGTM_SOCIEDAD SS ");
        sql.append(" ON SS.SOCIEDAD_ID = T.SOCIEDAD_ID ");
        sql.append(" INNER JOIN dbo.SGTM_GRUPO_EMPRESARIAL SGE ");
        sql.append(" ON SGE.GRUPO_EMPRESARIAL_ID = SS.GRUPO_EMPRESARIAL_ID ");
        sql.append(" WHERE ");
        sql.append(" T.RANGO IS NOT NULL ");
        if (parametros.get("rangoOrden") != null) {
            sql.append(" AND T.RANGO = '" + parametros.get("rangoOrden") + "' ");
        }
        sql.append(" ORDER BY ");
        sql.append(" T.RANGO ");

        List<OperacionCuentaDTO> registros = jdbcTemplate.query(sql.toString(), new HashMap<String, Object>(), new BeanPropertyRowMapper<OperacionCuentaDTO>(OperacionCuentaDTO.class));


        return registros;
    }

    public List<RangoDetalleDTO> findRangoDetalle(Long rangoId) {
        return jdbcTemplate.query("SELECT EXPRESION , DESCRIPCION,ORDEN   FROM SGTM_RANGO_DETALLE WHERE RANGO_ID=" + rangoId+ " order by ORDEN ", new HashMap<String, Object>(), new BeanPropertyRowMapper<RangoDetalleDTO>(RangoDetalleDTO.class));
    }
    public List<RepAnnosCxPDTO> findRepoteRango(ReporteContext reporteContext) {
        if (reporteContext.getRangoSelect() == null) return new ArrayList<RepAnnosCxPDTO>();


        List<RangoDetalleDTO> rangoList = findRangoDetalle(reporteContext.getRangoSelect());

        if (rangoList.isEmpty()) return new ArrayList<RepAnnosCxPDTO>();

        int i = 1;

        StringBuffer sql = new StringBuffer();
        sql.append(" SELECT ");
        sql.append(" T.CHECKPOINT_ID AS checkPointId, ");
        sql.append(" SGE.NOMBRE AS grupoEmpresarialNombre, ");
        sql.append(" T.SOCIEDAD_ID AS sociedadId, ");
        sql.append(" T.RANGO rango , ");
        sql.append(" CASE ");
        for (RangoDetalleDTO rangoDetalleDTO : rangoList) {
            sql.append("WHEN T.RANGO ='" + rangoDetalleDTO.getOrden() + "' THEN '" + rangoDetalleDTO.getDescripcion() + "' ");
        }
        sql.append(" END AS rangoLabel, ");
        sql.append(" SUM (CASE WHEN ANNO <= " + reporteContext.getCheckPoint().getAnno1() + " AND ANNO > 1900 THEN 1 ELSE 0  END ) as cantidad" +
                "Anno1, ");
        sql.append(" SUM (CASE WHEN ANNO <= " + reporteContext.getCheckPoint().getAnno1() + " AND ANNO > 1900 THEN T.TOTAL ELSE 0  END ) as anno1, ");
        sql.append(" SUM (CASE WHEN ANNO = " + reporteContext.getCheckPoint().getAnno2() + " THEN 1 ELSE 0 END ) as cantidadAnno2, ");
        sql.append(" SUM (CASE WHEN ANNO = " + reporteContext.getCheckPoint().getAnno2() + " THEN T.TOTAL ELSE 0 END ) as anno2, ");
        sql.append(" SUM (CASE WHEN ANNO = " + reporteContext.getCheckPoint().getAnno3() + " THEN 1 ELSE 0 END ) as cantidadAnno3, ");
        sql.append(" SUM (CASE WHEN ANNO = " + reporteContext.getCheckPoint().getAnno3() + " THEN T.TOTAL ELSE 0 END ) as anno3, ");
        sql.append(" SUM (CASE WHEN ANNO = " + reporteContext.getCheckPoint().getAnno4() + " THEN 1 ELSE 0 END ) as cantidadAnno4, ");
        sql.append(" SUM (CASE WHEN ANNO = " + reporteContext.getCheckPoint().getAnno4() + " THEN T.TOTAL ELSE 0 END ) as anno4, ");
        sql.append(" SUM (CASE WHEN ANNO >= 1 AND ANNO  <= 2 THEN 1 ELSE 0 END ) as cantidadBimestre1, ");
        sql.append(" SUM (CASE WHEN ANNO >= 1 AND ANNO  <= 2 THEN T.TOTAL ELSE 0 END ) as bimestre1, ");
        sql.append(" SUM (CASE WHEN ANNO > 2 AND ANNO  <= 4 THEN 1 ELSE 0 END ) as cantidadBimestre2, ");
        sql.append(" SUM (CASE WHEN ANNO > 2 AND ANNO  <= 4 THEN T.TOTAL ELSE 0 END ) as bimestre2, ");
        sql.append(" SUM (CASE WHEN ANNO > 4 AND ANNO  <= 6 THEN 1 ELSE 0 END ) as cantidadBimestre3, ");
        sql.append(" SUM (CASE WHEN ANNO > 4 AND ANNO  <= 6 THEN T.TOTAL ELSE 0 END ) as bimestre3, ");
        sql.append(" SUM (CASE WHEN ANNO > 6 AND ANNO  <= 8 THEN 1 ELSE 0 END ) as cantidadBimestre4, ");
        sql.append(" SUM (CASE WHEN ANNO > 6 AND ANNO  <= 8 THEN T.TOTAL ELSE 0 END ) as bimestre4, ");
        sql.append(" SUM (CASE WHEN ANNO > 8 AND ANNO  <= 10 THEN 1 ELSE 0 END ) as cantidadBimestre5, ");
        sql.append(" SUM (CASE WHEN ANNO > 8 AND ANNO  <= 10 THEN T.TOTAL ELSE 0 END ) as bimestre5, ");
        sql.append(" SUM (CASE WHEN ANNO > 10 AND ANNO  <= 12 THEN 1 ELSE 0 END ) as cantidadBimestre6, ");
        sql.append(" SUM (CASE WHEN ANNO > 10 AND ANNO  <= 12 THEN T.TOTAL ELSE 0 END ) as bimestre6, ");
        sql.append(" SUM (CASE WHEN ANNO >= 1 AND ANNO  <= 3 THEN 1 ELSE 0 END ) as cantidadTrimestre1, ");
        sql.append(" SUM (CASE WHEN ANNO >= 1 AND ANNO  <= 3 THEN T.TOTAL ELSE 0 END ) as trimestre1, ");
        sql.append(" SUM (CASE WHEN ANNO > 3 AND ANNO  <= 6 THEN 1 ELSE 0 END ) as cantidadTrimestre2, ");
        sql.append(" SUM (CASE WHEN ANNO > 3 AND ANNO  <= 6 THEN T.TOTAL  ELSE 0 END ) as trimestre2, ");
        sql.append(" SUM (CASE WHEN ANNO > 6 AND ANNO  <= 9 THEN 1 ELSE 0 END ) as cantidadTrimestre3, ");
        sql.append(" SUM (CASE WHEN ANNO > 6 AND ANNO  <= 9 THEN T.TOTAL ELSE 0 END ) as trimestre3, ");
        sql.append(" SUM (CASE WHEN ANNO > 9 AND ANNO  <= 12 THEN 1 ELSE 0 END ) as cantidadTrimestre4, ");
        sql.append(" SUM (CASE WHEN ANNO > 9 AND ANNO  <= 12 THEN T.TOTAL ELSE 0 END ) as trimestre4, ");
        sql.append(" SUM (CASE WHEN ANNO >= 1 AND ANNO  <= 3 THEN 1 ELSE 0 END ) as cantidadSemestre1, ");
        sql.append(" SUM (CASE WHEN ANNO >= 1 AND ANNO  <= 3 THEN T.TOTAL ELSE 0 END ) as semestre1, ");
        sql.append(" SUM (CASE WHEN ANNO > 3 AND ANNO  <= 6 THEN 1 ELSE 0 END ) as cantidadSemestre2, ");
        sql.append(" SUM (CASE WHEN ANNO > 3 AND ANNO  <= 6 THEN T.TOTAL ELSE 0 END ) as semestre2 ");
        sql.append(" ");
        sql.append(" FROM ");
        sql.append(" ( ");
        sql.append(" SELECT ");
        sql.append(" YEAR(TT.FECHA_RECIENTE) ANNO, ");
        sql.append(" TT.CHECKPOINT_ID, ");
        sql.append(" TT.SOCIEDAD_ID, ");
        sql.append(" TT.NUMERO_DOCUMENTO_COMPRA, ");
        sql.append(" TT.TOTAL, ");
        sql.append(" CASE ");
        i = 1;
        for (RangoDetalleDTO rango : rangoList) {
            String[] item = StringUtils.split(rango.getExpresion(), " ");
            if (item.length > 5) {
                Map<String, String> parametros = new HashMap<String, String>();
                parametros.put("#expresion1#", item[2]);
                parametros.put("#min#", item[3]);
                parametros.put("#expresion2#", item[8]);
                parametros.put("#max#", item[9]);

                parametros.put("#orden#", rango.getOrden());
                sql.append(StringUtil.replaceFull(templateRango2, parametros));
            } else  {
                Map<String, String> parametros = new HashMap<String, String>();
                parametros.put("#expresion1#", item[2]);
                parametros.put("#min#", item[3]);
                parametros.put("#orden#", rango.getOrden());
                sql.append(StringUtil.replaceFull(templateRango1, parametros));
            }
        }
        sql.append(" ELSE NULL ");
        sql.append(" END as RANGO ");
        sql.append(" FROM ( ");
        sql.append(" SELECT ");
        sql.append(" DETALLE.CHECKPOINT_ID, ");
        sql.append(" DETALLE.SOCIEDAD_ID, ");
        sql.append(" DETALLE.NUMERO_DOCUMENTO_COMPRA, ");
        sql.append(" DETALLE.FECHA_RECIENTE, ");
        sql.append(" SUM(" + reporteContext.getColumnMonto() + ") TOTAL ");
        sql.append(" FROM ");
        sql.append(" SGTM_OPERACION_CUENTA DETALLE ");
        sql.append(" WHERE ");
        sql.append(" DETALLE.CHECKPOINT_ID = " + reporteContext.getCheckPointId() + " ");
        sql.append(" AND DETALLE.NUMERO_DOCUMENTO_COMPRA IS NOT NULL ");
        sql.append(" GROUP BY ");
        sql.append(" DETALLE.CHECKPOINT_ID, ");
        sql.append(" DETALLE.SOCIEDAD_ID, ");
        sql.append(" DETALLE.NUMERO_DOCUMENTO_COMPRA, ");
        sql.append(" DETALLE.FECHA_RECIENTE ");
        sql.append(" ) AS TT ");
        sql.append(" UNION ");
        sql.append(" SELECT ");
        sql.append(" MONTH(TT.FECHA_RECIENTE) ANNO, ");
        sql.append(" TT.CHECKPOINT_ID, ");
        sql.append(" TT.SOCIEDAD_ID, ");
        sql.append(" TT.NUMERO_DOCUMENTO_COMPRA, ");
        sql.append(" TT.TOTAL, ");
        sql.append(" CASE ");
//        i = 1;
        for (RangoDetalleDTO rango : rangoList) {
            String[] item = StringUtils.split(rango.getExpresion(), " ");
            if (item.length > 5) {
                Map<String, String> parametros = new HashMap<String, String>();
                parametros.put("#expresion1#", item[2]);
                parametros.put("#min#", item[3]);
                parametros.put("#expresion2#", item[8]);
                parametros.put("#max#", item[9]);

                parametros.put("#orden#", rango.getOrden());
                sql.append(StringUtil.replaceFull(templateRango2, parametros));
            } else  {
                Map<String, String> parametros = new HashMap<String, String>();
                parametros.put("#expresion1#", item[2]);
                parametros.put("#min#", item[3]);
                parametros.put("#orden#", rango.getOrden());
                sql.append(StringUtil.replaceFull(templateRango1, parametros));
            }

        }
        sql.append(" ELSE NULL ");
        sql.append(" END as RANGO ");
        sql.append(" FROM ( ");
        sql.append(" SELECT ");
        sql.append(" DETALLE.CHECKPOINT_ID, ");
        sql.append(" DETALLE.SOCIEDAD_ID, ");
        sql.append(" DETALLE.NUMERO_DOCUMENTO_COMPRA, ");
        sql.append(" DETALLE.FECHA_RECIENTE, ");
        sql.append(" SUM(" + reporteContext.getColumnMonto() + ")TOTAL ");
        sql.append(" FROM ");
        sql.append(" SGTM_OPERACION_CUENTA DETALLE ");
        sql.append(" WHERE ");
        sql.append(" DETALLE.CHECKPOINT_ID = " + reporteContext.getCheckPointId() + " ");
        sql.append(" AND YEAR(DETALLE.FECHA_RECIENTE) = " + reporteContext.getCheckPoint().getAnno4() + " ");
        sql.append(" AND DETALLE.NUMERO_DOCUMENTO_COMPRA IS NOT NULL ");
        sql.append(" AND DETALLE.FECHA_RECIENTE IS NOT NULL ");
        sql.append(" GROUP BY ");
        sql.append(" DETALLE.CHECKPOINT_ID, ");
        sql.append(" DETALLE.SOCIEDAD_ID, ");
        sql.append(" DETALLE.NUMERO_DOCUMENTO_COMPRA, ");
        sql.append(" DETALLE.FECHA_RECIENTE ");
        sql.append(" )AS TT ");
        sql.append(" ) ");
        sql.append(" AS T ");
        sql.append(" INNER JOIN dbo.SGTM_SOCIEDAD SS ON SS.SOCIEDAD_ID = T.SOCIEDAD_ID ");
        sql.append(" INNER JOIN dbo.SGTM_GRUPO_EMPRESARIAL SGE ON SGE.GRUPO_EMPRESARIAL_ID = SS.GRUPO_EMPRESARIAL_ID ");
        sql.append(" WHERE T.RANGO IS NOT NULL ");
        sql.append(" GROUP BY ");
        sql.append(" T.CHECKPOINT_ID, ");
        sql.append(" SGE.NOMBRE, ");
        sql.append(" T.SOCIEDAD_ID , ");
        sql.append(" T.RANGO ");
        sql.append(" ORDER BY T.RANGO ");

        return jdbcTemplate.query(sql.toString(), new HashMap<String, Object>(), new BeanPropertyRowMapper<RepAnnosCxPDTO>(RepAnnosCxPDTO.class));
    }

    public List<RepAnnosCxPDTO> findRepoteAgrupacionCategoriaCxA(Long checkPoint,Long usuarioId, String columna) {


        StringBuffer sql = new StringBuffer();


        sql.append(" SELECT ");
        sql.append(" DETALLE.CHECKPOINT_ID checkPointId,  ");
        sql.append(" SGE.NOMBRE grupoEmpresarialNombre,  ");
        sql.append(" DETALLE.SOCIEDAD_ID sociedadId,  ");
        sql.append(" SA.RESPONSABLE responsable,  ");
        sql.append(" DETALLE.CUENTA_CONTABLE_ID cuentaContableId,  ");
        sql.append(" SCC.DESCRIPCION  cuentaContableNombre,  ");
        sql.append(" CASE when dsac.tipo_categoria = '0' THEN 'VINCULADAS' ELSE 'TERCEROS' END  as tipoCategoria  , ");
        sql.append(" dsac.AGRUPACION_ID agrupacionId,  ");
        sql.append(" SA.NOMBRE AS agrupacionNombre, ");
        sql.append(" SUM(" + columna + ") totalAnno");
        sql.append(" FROM  ");
        sql.append(" SGTM_OPERACION_CUENTA DETALLE  ");
        sql.append(" INNER JOIN dbo.SGTR_AGRUPACION_CUENTA dsac  ");
        sql.append(" ON dsac.CUENTA_CONTABLE_ID= DETALLE.CUENTA_CONTABLE_ID  ");
        sql.append(" INNER JOIN dbo.SGTM_SOCIEDAD SC ON SC.SOCIEDAD_ID = DETALLE.SOCIEDAD_ID  ");
        sql.append(" INNER JOIN dbo.SGTM_GRUPO_EMPRESARIAL SGE ON SGE.GRUPO_EMPRESARIAL_ID = SC.GRUPO_EMPRESARIAL_ID  ");
        sql.append(" INNER JOIN dbo.SGTM_CUENTA_CONTABLE SCC ON SCC.CUENTA_CONTABLE_ID=DETALLE.CUENTA_CONTABLE_ID  ");
        sql.append(" INNER JOIN dbo.SGTM_AGRUPACION sa ON dsac.AGRUPACION_ID=sa.AGRUPACION_ID  ");
        sql.append(" where  ");
        sql.append(" DETALLE.CHECKPOINT_ID = " + checkPoint + "  ");
        sql.append(" AND dsac.tipo_categoria IS NOT NULL  ");
        sql.append(" AND sa.USUARIO_ID = "+usuarioId+" ");
        sql.append(" GROUP BY  ");
        sql.append(" DETALLE.CHECKPOINT_ID ,  ");
        sql.append(" SGE.NOMBRE ,  ");
        sql.append(" DETALLE.SOCIEDAD_ID ,  ");
        sql.append(" SA.RESPONSABLE ,  ");
        sql.append(" DETALLE.CUENTA_CONTABLE_ID ,  ");
        sql.append(" SCC.DESCRIPCION  ,  ");
        sql.append(" dsac.tipo_categoria ,  ");
        sql.append(" dsac.AGRUPACION_ID,  ");
        sql.append(" SA.NOMBRE   ");


        return jdbcTemplate.query(sql.toString(), new HashMap<String, Object>(), new BeanPropertyRowMapper<RepAnnosCxPDTO>(RepAnnosCxPDTO.class));

    }

/*
    public List<RepAnnosCxPDTO> findRepoteAgrupacionCategoriaCxA() {

        List<String> agrupacionList= Arrays.asList("x1","x2","x3");
        StringBuffer sql = new StringBuffer();

        sql.append(" T.CHECKPOINT_ID AS checkPointId,  ");
        sql.append(" T.NOMBRE as grupoEmpresarialNombre,  ");
        sql.append(" T.SOCIEDAD_ID as sociedadId,  ");
        sql.append(" T.RESPONSABLE as responsable,  ");
        sql.append(" T.CUENTA_CONTABLE_ID as cuentaContableId,  ");
        sql.append(" T.DESCRIPCION  as cuentaContableNombre,  ");
        sql.append(" T.tipo_categoria ,  ");
        int i=1;
        for (String codigoAgrupacion : agrupacionList) {
            if (i!=1) sql.append(", ");

            sql.append(" SUM (CASE WHEN T.AGRUPACION_ID= '" + codigoAgrupacion + "' THEN T.TOTAL_ANNO ELSE 0 END ) as anno" + i);
            i++;
        }

        sql.append(" FROM (  ");


        sql.append(" SELECT ");
        sql.append(" DETALLE.CHECKPOINT_ID ,  ");
        sql.append(" SGE.NOMBRE ,  ");
        sql.append(" DETALLE.SOCIEDAD_ID ,  ");
        sql.append(" SA.RESPONSABLE ,  ");
        sql.append(" DETALLE.CUENTA_CONTABLE_ID ,  ");
        sql.append(" SCC.DESCRIPCION  ,  ");
        sql.append(" dsac.tipo_categoria ,  ");
        sql.append(" dsac.AGRUPACION_ID,  ");
        sql.append(" SUM(DETALLE.MONTO_IMPORTE_VALORADO) TOTAL_ANNO  ");
        sql.append(" FROM  ");
        sql.append(" SGTM_OPERACION_CUENTA DETALLE  ");
        sql.append(" INNER JOIN dbo.SGTR_AGRUPACION_CUENTA dsac  ");
        sql.append(" ON dsac.CUENTA_CONTABLE_ID= DETALLE.CUENTA_CONTABLE_ID  ");
        sql.append(" INNER JOIN dbo.SGTM_SOCIEDAD SC ON SC.SOCIEDAD_ID = DETALLE.SOCIEDAD_ID  ");
        sql.append(" INNER JOIN dbo.SGTM_GRUPO_EMPRESARIAL SGE ON SGE.GRUPO_EMPRESARIAL_ID = SC.GRUPO_EMPRESARIAL_ID  ");
        sql.append(" INNER JOIN dbo.SGTM_CUENTA_CONTABLE SCC ON SCC.CUENTA_CONTABLE_ID=DETALLE.CUENTA_CONTABLE_ID  ");
        sql.append(" INNER JOIN dbo.SGTM_AGRUPACION sa ON DETALLE.AGRUPACION_ID=sa.AGRUPACION_ID  ");
        sql.append(" where  ");
        sql.append(" DETALLE.CHECKPOINT_ID = 16  ");
        sql.append(" AND dsac.tipo_categoria IS NOT NULL  ");
        sql.append(" GROUP BY  ");
        sql.append(" DETALLE.CHECKPOINT_ID ,  ");
        sql.append(" SGE.NOMBRE ,  ");
        sql.append(" DETALLE.SOCIEDAD_ID ,  ");
        sql.append(" SA.RESPONSABLE ,  ");
        sql.append(" DETALLE.CUENTA_CONTABLE_ID ,  ");
        sql.append(" SCC.DESCRIPCION  ,  ");
        sql.append(" dsac.tipo_categoria ,  ");
        sql.append(" dsac.AGRUPACION_ID  ");
        sql.append(" ) AS T ");


        return jdbcTemplate.query(sql.toString(), new HashMap<String, Object>(), new BeanPropertyRowMapper<RepAnnosCxPDTO>(RepAnnosCxPDTO.class));

    }

*/

    public static void main(String[] args) {
        String[] result=StringUtils.split("[ Total > 1000 ]"," ");
        System.out.println(result);
    }
}
